function fn() {
  console.log(myName);
}
function fn2() {
  let myName = '南北绿豆';
  fn(); // fn被调用，JS引擎会先查找fn的声明，发现fn不在fn2的作用域内，然后向上查找，发现fn在全局作用域内，同时fn的词法作用域通过一个outer指针也指向了全局作用域
}
let myName = '哈基米'; // 因此有结论： 函数在上下文查找变量时，找的是函数声明所在的作用域，而不是调用时的作用域
fn2();

// 函数执行上下文：当一个函数被调用时，js引擎会先创建一个对应的“函数执行上下文”对象，并将函数中声明的变量与函数都存在其中。供函数执行时使用，由此才实现了函数作用域的概念
// 函数执行上下文组成：·
// 变量环境：保存使用var关键字声明的对象和函数内部声明的子函数，由此实现常见的“函数作用域”
// 词法环境：保存使用let关键字声明的对象，主要用于实现“块级作用域”的功能

// outer指针：当一个函数执行上文被创建时，其内部存在一个指针outer指向该函数被定义时所在的词法作用域
// 词法作用域：一个函数被编译时一定会用一个outer指针记录该执行上下文（作用域）的外层（作用域）是谁。
